package com.xzq.Hot100;

/**
 * @Author xzq
 * @Description //无重复字符的最长子串
 * @Date 2021/12/8 21:32
 * @Version 1.0.0
 **/
public class Demo03 {

    public static void main(String[] args) {
        String s = "abcabcbb";
        int i = lengthOfLongestSubstring(s);
        System.out.println(i);
    }

    //减少string对象频繁创建开销
    private static int lengthOfLongestSubstring(String s) {
        StringBuilder sb = new StringBuilder();
        int maxLength = 0;
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (sb.toString().contains(String.valueOf(c))) {
                    maxLength = Math.max(sb.length(), maxLength);
                   sb= new StringBuilder(sb.substring(sb.indexOf(String.valueOf(c)) + 1));
                }
                sb.append(c);
            }
        return Math.max(sb.length(),maxLength);
    }
//    private static int lengthOfLongestSubstring(String s) {
//        String str = "";
//        int maxLength = 0;
//        int pointer = 0;
//        while (pointer <  s.length()) {
//            for (int i = pointer; i < s.length(); i++) {
//                char c = s.charAt(i);
//                if (str.contains(String.valueOf(c))) {
//                    maxLength = Math.max(str.length(), maxLength);
//                    str = str.substring(str.indexOf(c)+1)+c;
//                    //指针+1
//                    pointer = i+1;
//                    break;
//                }
//                str += c;
//            }
//        }
//        return Math.max(str.length(),maxLength);
//    }
    //憨批解法
//    public static int lengthOfLongestSubstring(String s) {
//        String str = "";
//        int maxLength = 0;
//        int pointer = 0;
//        while (pointer <  s.length()) {
//            for (int i = pointer; i < s.length(); i++) {
//                char c = s.charAt(i);
//                if (str.contains(String.valueOf(c))) {
//                    maxLength = Math.max(str.length(), maxLength);
//                    str = "";
//                    //指针+1
//                    pointer++;
//                    break;
//                }
//                str += c;
//            }
//        }
//        return Math.max(str.length(),maxLength);
//    }



//    public static int lengthOfLongestSubstring(String s) {
//        // 记录字符上一次出现的位置
//        int[] last = new int[128];
//        for(int i = 0; i < 128; i++) {
//            last[i] = -1;
//        }
//        int n = s.length();
//        int res = 0;
//        int start = 0; // 窗口开始位置
//        for(int i = 0; i < n; i++) {
//            int index = s.charAt(i);
//            start = Math.max(start, last[index] + 1);
//            res   = Math.max(res, i - start + 1);
//            last[index] = i;
//        }
//        return res;
//    }
}
